/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
export function parseTime(time, cFormat) {
  // arguments伪数组，只在function函数内才能使用，搜集所有实参
  // 容错判断：没有传参/传递的time值为空
  if (arguments.length === 0 || !time) {
    return null
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'// 格式化目标格式
  let date // 保存日期对象
  if (typeof time === 'object') {
    date = time
  } else {
    if ((typeof time === 'string')) {
      if ((/^[0-9]+$/.test(time))) { // 只能由0-9的数字组成（+匹配左侧1到多次）
        // support "1548221490638"
        time = parseInt(time)
      } else {
        // support safari（支持ios内置的浏览器，时间字符串只能用/）
        // 例如：时间格式为：'2022-09-30'
        // 将 - 替换成 /   即'2022/09/30'
        // g全局匹配，可以匹配多次
        // m多行匹配
        // replace()替换方法，把参数1匹配的，换成参数2
        time = time.replace(new RegExp(/-/gm), '/')
      }
    }
    // 如果是数字，且长度10位（即传进来的是秒），但new Date()里要求传入的是毫秒，所以要*1000
    if ((typeof time === 'number') && (time.toString().length === 10)) {
      time = time * 1000
    }
    date = new Date(time)
  }

  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1, // 因为日期对象.getMonth()是从0-11
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay() // 周
  }
  // 把占位符替换
  // 正则：先匹配左右两侧必须是{}，接着匹配中间为{[ymdhisa]}+
  // replace()参数2，可以是直接是一个替换的值，也可以是一个回调函数
  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
    // result 匹配到的子串，例如：{y}，{m}...
    // key 匹配()里到，例如：y，m ...
    const value = formatObj[key]// 换值
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
    // 用0-6数字作为下标，换出中文字符
    return value.toString().padStart(2, '0')
    // padStart在头部用0补全长度（即在月日时分秒为1位时，前面补零）
    // 其他方法: value = value < 10 ? '0' + value : value
  })
  return time_str
}

/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  // 类型转换,转换成字符串
  if (('' + time).length === 10) {
    time = parseInt(time) * 1000
  } else {
    time = +time
  }
  const d = new Date(time)// 时间戳变成日期对象
  const now = Date.now()// 获取当前时间戳

  const diff = (now - d) / 1000// 可以用时间戳-日期对象,返回时间戳差值

  if (diff < 30) {
    return '刚刚'
  } else if (diff < 3600) {
    // less 1 hour
    // Math.ceil()向上取整
    // Math.floor()向下取整
    // Math.rand()四舍五入
    return Math.ceil(diff / 60) + '分钟前'
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前'
  } else if (diff < 3600 * 24 * 2) {
    return '1天前'
  }
  if (option) {
    return parseTime(time, option)
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      d.getDate() +
      '日' +
      d.getHours() +
      '时' +
      d.getMinutes() +
      '分'
    )
  }
}

/**
 * url传入，转换成字符串对象
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
  // decodeURIComponent,将已编码 URI 中所有能识别的转义序列转换成原字符。
  // url编码：例如：%D1%88%D0%B5%D0%（中文和一些特殊字符在浏览器地址中可能会被自动转化成url编码）
  // url.split('?')[1]，拿到？后的字符串，如果字符串中有+号，则替换为空格
  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')

  if (!search) {
    return {}
  }
  // 例如：xxxxx?name=leo&age=18
  const obj = {}
  const searchArr = search.split('&') // 返回数组对象['name=leo','age=18']

  searchArr.forEach(v => { // v是数组里的每一项
    const index = v.indexOf('=')// 查找=字符下标
    if (index !== -1) { // 找到了
      const name = v.substring(0, index)// 截取=前的
      const val = v.substring(index + 1, v.length)// 截取=后的
      obj[name] = val// 把参数名和值，添加到obj空对象里
    }
  })
  return obj
}
